package org.wdcode.core.params;

import org.wdcode.common.constants.DateConstants;
import org.wdcode.common.constants.EncodingConstants;
import org.wdcode.common.constants.StringConstants;
import org.wdcode.common.params.WdParams;
import org.wdcode.core.constants.DataBaseConstants;
import org.wdcode.core.constants.XmlConstants;
import org.wdcode.core.datasource.DataSourceParse;
import org.wdcode.core.excel.ExcelParse;
import org.wdcode.core.xml.XMLParse;

/**
 * WdCore包所用参数读取类
 * @author WD
 * @since JDK6
 * @version 1.0 2010-01-05
 */
public final class WdCoreParams extends WdParams {
	/* 读取配置变量 */
	/* Excel */
	private static ExcelParse		excelParse					= ExcelParse.ExcelPOI;				// 默认解析Excel所需要的包

	/* XML 使用 */
	private static XMLParse			xmlParse					= XMLParse.Dom4J;					// Xml解析包
	private static String			xmlRoot						= XmlConstants.NODE_ROOT;			// Xml的根节点名称
	private static String			xmlEncoding					= EncodingConstants.UTF_8;			// Xml的编码格式

	/* DataSource使用 */
	private static String			dataSourceDriver;												// 获得DataSource驱动类
	private static String			dataSourceUrl;													// 获得DataSourceUrl
	private static String			dataSourceUser;												// 获得DataSourceUser
	private static String			dataSourcePassword;											// 获得DataSourcePassword
	private static int				dataSourceInitialPoolSize	= 20;								// 获得初始化连接数
	private static int				dataSourceMaxPoolSize		= 50;								// 连接池最大连接数
	private static int				dataSourceMinPoolSize		= 10;								// 连接池最小连接数
	private static int				dataSourceMaxSize			= 100;								// 最大连接数
	private static long				dataSourceTimeout			= DateConstants.TIME_MINUTE * 3;	// 超时等待时间
	private static long				dataSourceMaxIdleTime		= DateConstants.TIME_MINUTE * 10;	// 测试空闲连接时间超出时间回收
	private static long				dataSourceIdleTimeout		= DateConstants.TIME_HOUR * 2;		// 多长时间检查一次空闲连接
	private static DataSourceParse	dataSourceParse				= DataSourceParse.DBCP;			// 默认使用的连接池

	/* 缓存使用 */
	private static int				cacheSize					= 0;								// 缓存大小

	/* 线程使用 */
	private static int				threadSize					= 5;								// 线程池大小
	private static int				timerSize					= 5;								// 线程池大小

	/* Lucene 使用 */
	private static String			luceneIndexPath				= StringConstants.EMPTY;			// Lucene索引保存位置

	/* 读取配置字符串 */
	/* Excel */
	private final static String		EXCEL_PARSE					= "excel.parse";					// 默认解析Excel所需要的包

	/* XML使用 */
	private final static String		XML_PARSE					= "xml.parse";						// Xml的解析包
	private final static String		XML_ROOT					= "xml.root";						// Xml的根节点名称
	private final static String		XML_ENCODING				= "xml.encoding";					// Xml的编码格式

	/* DataSource使用 */
	private final static String		DATASOURCE_DRIVER			= "dataSource.driver";				// 获得DataSource驱动类
	private final static String		DATASOURCE_URL				= "dataSource.url";				// 获得DataSourceUrl
	private final static String		DATASOURCE_USER				= "dataSource.user";				// 获得DataSourceUser
	private final static String		DATASOURCE_PASSWORD			= "dataSource.password";			// 获得DataSourcePassword
	private final static String		DATASOURCE_INITIALPOOLSIZE	= "dataSource.initialPoolSize";	// 获得初始化连接数
	private final static String		DATASOURCE_MAXPOOLSIZE		= "dataSource.maxPoolSize";		// 连接池最大连接数
	private final static String		DATASOURCE_MINPOOLSIZE		= "dataSource.minPoolSize";		// 连接池最小连接数
	private final static String		DATASOURCE_MAXSIZE			= "dataSource.maxSize";			// 最大连接数
	private final static String		DATASOURCE_TIMEOUT			= "dataSource.timeout";			// 超时等待时间
	private final static String		DATASOURCE_MAXIDLETIME		= "dataSource.maxIdleTime";		// 测试空闲连接时间超出时间回收
	private final static String		DATASOURCE_IDLETIMEOUT		= "dataSource.idleTimeout";		// 多长时间检查一次空闲连接
	private final static String		DATASOURCE_PARSE			= "dataSource.parse";				// 默认使用的连接池

	/* 缓存使用 */
	private final static String		CACHE_SIZE					= "cache.size";					// 缓存大小

	/* 线程使用 */
	private final static String		THREAD_SIZE					= "thread.size";					// 线程池大小
	private final static String		TIMER_SIZE					= "timer.size";					// 任务池大小

	/* Lucene 使用 */
	private final static String		LUCENE_INDEX_PATH			= "lucene.index.path";				// Lucene索引保存位置

	// 静态初始化
	static {
		read();
	}

	/**
	 * 读取参数配置
	 */
	public final static void read() {
		// 字符串 用于保存临时变量
		String str;

		/* 获得 Excel 配置 */
		excelParse = "jxl".equalsIgnoreCase(getString(EXCEL_PARSE)) ? ExcelParse.ExcelJXL : ExcelParse.ExcelPOI;

		/* 获得 XML 配置 */
		xmlEncoding = getString(XML_ENCODING, xmlEncoding);
		xmlRoot = getString(XML_ROOT, xmlRoot);
		xmlParse = "jdom".equalsIgnoreCase(getString(XML_PARSE)) ? XMLParse.JDom : XMLParse.Dom4J;

		/* DataSource使用 */
		dataSourceDriver = getString(DATASOURCE_DRIVER);
		dataSourceUrl = getString(DATASOURCE_URL);
		dataSourceUser = getString(DATASOURCE_USER);
		dataSourcePassword = getString(DATASOURCE_PASSWORD);
		dataSourceInitialPoolSize = getInt(DATASOURCE_INITIALPOOLSIZE, dataSourceInitialPoolSize);
		dataSourceMaxPoolSize = getInt(DATASOURCE_MAXPOOLSIZE, dataSourceMaxPoolSize);
		dataSourceMinPoolSize = getInt(DATASOURCE_MINPOOLSIZE, dataSourceMinPoolSize);
		dataSourceMaxSize = getInt(DATASOURCE_MAXSIZE, dataSourceMaxSize);
		dataSourceTimeout = getLong(DATASOURCE_TIMEOUT, dataSourceTimeout);
		dataSourceMaxIdleTime = getLong(DATASOURCE_MAXIDLETIME, dataSourceMaxIdleTime);
		dataSourceIdleTimeout = getLong(DATASOURCE_IDLETIMEOUT, dataSourceIdleTimeout);
		str = getString(DATASOURCE_PARSE);
		if (DataBaseConstants.DATABASE_TYPE_C3P0.equalsIgnoreCase(str)) {
			dataSourceParse = DataSourceParse.C3P0;
		} else if (DataBaseConstants.DATABASE_TYPE_PROXOOL.equalsIgnoreCase(str)) {
			dataSourceParse = DataSourceParse.Proxool;
		}

		/* 缓存使用 */
		cacheSize = getInt(CACHE_SIZE, cacheSize);

		/* 线程使用 */
		threadSize = getInt(THREAD_SIZE, threadSize);
		timerSize = getInt(TIMER_SIZE, timerSize);

		/* Lucene 使用 */
		luceneIndexPath = getString(LUCENE_INDEX_PATH, luceneIndexPath);
	}

	/**
	 * Lucene索引保存位置<br/>
	 * 需在配置文件中配置<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: lucene.index.path = ? <br/>
	 * XML: {@literal <lucene><index><path>?</path></index></lucene>}</h2>
	 * @return Lucene索引保存位置
	 */
	public final static String getLuceneIndexPath() {
		return luceneIndexPath;
	}

	/**
	 * 任务池大小 线程使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用5<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: timer.size = ? <br/>
	 * XML: {@literal <timer><size>?</size></timer>}</h2>
	 * @see org.wdcode.core.concurrent.ScheduledExecutorFactory
	 * @return 任务池大小
	 */
	public final static int getTimerSize() {
		return timerSize;
	}

	/**
	 * 线程池大小 线程使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用5<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: thread.size = ? <br/>
	 * XML: {@literal <thread><size>?</size></thread>}</h2>
	 * @see org.wdcode.core.concurrent.ExecutorFactory
	 * @return 线程池大小
	 */
	public final static int getThreadSize() {
		return threadSize;
	}

	/**
	 * 缓存大小 缓存使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用0<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: cache.size = ? <br/>
	 * XML: {@literal <cache><size>?</size></cache>}</h2>
	 * @see org.wdcode.core.cache.Cache
	 * @return 缓存大小
	 */
	public final static int getCacheSize() {
		return cacheSize;
	}

	/**
	 * 设置缓存大小
	 * @param cacheSize 缓存大小
	 */
	public final static void setCacheSize(int size) {
		cacheSize = size;
		setProperty(CACHE_SIZE, cacheSize);
	}

	/**
	 * 最大连接数 DataSourceFactory使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用100<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.maxSize = ? <br/>
	 * XML: {@literal <dataSource><maxSize>?</maxSize></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return 最大连接数
	 */
	public final static int getDataSourceMaxSize() {
		return dataSourceMaxSize;
	}

	/**
	 * 超时等待时间 DataSourceFactory使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用1000L * 60 * 3<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.timeout = ? <br/>
	 * XML: {@literal <dataSource><timeout>?</timeout></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return 超时等待时间
	 */
	public final static long getDataSourceTimeout() {
		return dataSourceTimeout;
	}

	/**
	 * 测试空闲连接时间超出时间回收 DataSourceFactory使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用1000L * 60 * 10<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.maxIdleTime = ? <br/>
	 * XML: {@literal <dataSource><maxIdleTime>?</maxIdleTime></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return 测试空闲连接时间超出时间回收
	 */
	public final static long getDataSourceMaxIdleTime() {
		return dataSourceMaxIdleTime;
	}

	/**
	 * 多长时间检查一次空闲连接 DataSourceFactory使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用1000L * 60 * 60 * 2<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.idleTimeout = ? <br/>
	 * XML: {@literal <dataSource><idleTimeout>?</idleTimeout></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return 多长时间检查一次空闲连接
	 */
	public final static long getDataSourceIdleTimeout() {
		return dataSourceIdleTimeout;
	}

	/**
	 * 获得DataSource驱动类 DataSourceFactory使用<br/>
	 * 需在配置文件中配置<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.driver = ? <br/>
	 * XML: {@literal <dataSource><driver>?</driver></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return DataSource驱动类
	 */
	public final static String getDataSourceDriver() {
		return dataSourceDriver;
	}

	/**
	 * 获得DataSourceUrl DataSourceFactory使用<br/>
	 * 需在配置文件中配置<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.url = ? <br/>
	 * XML: {@literal <dataSource><url>?</url></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return DataSourceUrl
	 */
	public final static String getDataSourceUrl() {
		return dataSourceUrl;
	}

	/**
	 * 获得DataSourceUser DataSourceFactory使用<br/>
	 * 需在配置文件中配置<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.user = ? <br/>
	 * XML: {@literal <dataSource><user>?</user></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return DataSourceUser
	 */
	public final static String getDataSourceUser() {
		return dataSourceUser;
	}

	/**
	 * 获得DataSourcePassword DataSourceFactory使用<br/>
	 * 需在配置文件中配置<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.password = ? <br/>
	 * XML: {@literal <dataSource><password>?</password></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return DataSourcePassword
	 */
	public final static String getDataSourcePassword() {
		return dataSourcePassword;
	}

	/**
	 * 获得初始化连接数 DataSourceFactory使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用20<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.initialPoolSize = ? <br/>
	 * XML: {@literal
	 * <dataSource><initialPoolSize>?</initialPoolSize></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return 初始化连接数
	 */
	public final static int getDataSourceInitialPoolSize() {
		return dataSourceInitialPoolSize;
	}

	/**
	 * 连接池最大连接数 DataSourceFactory使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用50<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.maxPoolSize = ? <br/>
	 * XML: {@literal <dataSource><maxPoolSize>?</maxPoolSize></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return 连接池最大连接数
	 */
	public final static int getDataSourceMaxPoolSize() {
		return dataSourceMaxPoolSize;
	}

	/**
	 * 连接池最小连接数 DataSourceFactory使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用10<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.minPoolSize = ? <br/>
	 * XML: {@literal <dataSource><minPoolSize>?</minPoolSize></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return 连接池最小连接数
	 */
	public final static int getDataSourceMinPoolSize() {
		return dataSourceMinPoolSize;
	}

	/**
	 * 默认使用的连接池 DataSourceFactory使用<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用DBCP<br/>
	 * <h2>配置方式如下: <br/>
	 * Properties: dataSource.parse = ? <br/>
	 * XML: {@literal <dataSource><parse>?</parse></dataSource>}</h2>
	 * @see org.wdcode.core.datasource.parse.DataSourceFactory
	 * @return 默认使用的连接池
	 */
	public static DataSourceParse getDataSourceParse() {
		return dataSourceParse;
	}

	/**
	 * 获得XML解析所用的包,org.wdcode.common.xml.XMLFactory使用.<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用dom4j<br/>
	 * <h2>注: 取值是 dom4j,jdom 配置方式如下: <br/>
	 * Properties: xml.parse = ? <br/>
	 * XML: {@literal <xml><parse>?</parse></xml>}</h2>
	 * @see org.wdcode.common.xml.XMLFactory
	 * @return XML解析所用的包
	 */
	public final static XMLParse getXmlParse() {
		return xmlParse;
	}

	/**
	 * 获得XML默认根节点名称,org.wdcode.common.xml.XMLFactory使用.<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用root<br/>
	 * <h2>注: 取值是 任意非空字符串 配置方式如下: <br/>
	 * Properties: xml.root = ? <br/>
	 * XML: {@literal <xml><root>?</root></xml>}</h2>
	 * @see org.wdcode.common.xml.XMLFactory
	 * @return XML默认根节点名称
	 */
	public final static String getXmlRoot() {
		return xmlRoot;
	}

	/**
	 * 设置XML默认根节点名称
	 * @param root XML默认根节点名称
	 */
	public final static void setXmlRoot(String root) {
		xmlRoot = root;
		setProperty(XML_ROOT, xmlRoot);
	}

	/**
	 * 获得XML默认编码格式,org.wdcode.common.xml.XMLFactory使用.<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用UTF-8<br/>
	 * <h2>注: 取值是编码格式 如 UTF-8,GBK 等 配置方式如下: <br/>
	 * Properties: xml.encoding = ? <br/>
	 * XML: {@literal <xml><encoding>?</encoding></xml>}</h2>
	 * @see org.wdcode.common.xml.XMLFactory
	 * @return XML默认编码格式
	 */
	public final static String getXmlEncoding() {
		return xmlEncoding;
	}

	/**
	 * XML默认编码格式
	 * @param encoding XML默认编码格式
	 */
	public final static void setXmlEncoding(String encoding) {
		xmlEncoding = encoding;
		setProperty(XML_ENCODING, xmlEncoding);
	}

	/**
	 * 获得Excel解析包,org.wdcode.common.office.ExcelUtil使用.<br/>
	 * 需在配置文件中配置,如果不配置或配置不对将优先使用poi<br/>
	 * <h2>注: 取值是 poi,jxl 任意非空字符串 配置方式如下: <br/>
	 * Properties: excel.parse = ? <br/>
	 * XML: {@literal <excel><parse>?</parse></excel>}</h2>
	 * @return Excel解析包
	 */
	public final static ExcelParse getExcelParse() {
		return excelParse;
	}

	/**
	 * 私有构造
	 */
	private WdCoreParams() {}
}
